package cn.edu.nuaa.aadl2.generatorC.template

import org.osate.aadl2.SystemSubcomponent
import cn.edu.nuaa.aadl2.generatorC.utils.Tools
import org.osate.aadl2.SystemClassifier
import org.osate.aadl2.SystemType
import org.osate.aadl2.SystemImplementation
import static extension cn.edu.nuaa.aadl2.generatorC.template.Template.*
import static extension cn.edu.nuaa.aadl2.generatorC.workflow.Generate.*
import static extension cn.edu.nuaa.aadl2.generatorC.utils.StringUtils.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.DataTemplate.*;
import static extension cn.edu.nuaa.aadl2.generatorC.utils.StringUtils.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.SubcomponentTemplate.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.DataTemplate.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.FeatureTemplate.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.ConnectionTemplate.*
import static extension cn.edu.nuaa.aadl2.generatorC.template.CoreXml.*
import org.osate.aadl2.PublicPackageSection
import org.osate.aadl2.AadlPackage
import org.osate.aadl2.Subcomponent
import org.osate.aadl2.ProcessSubcomponent
import cn.edu.nuaa.aadl2.generatorC.utils.FileHelper

class SystemTemplate {
	

	def static subsystemCreate(SystemSubcomponent subsystem,String systemFolder){
		var system=subsystem.classifier
		switch system{
			SystemType : '''
				«System.out.println("SystemTemplate subsystemCreate()还未添加应对SystemType方法")»
			'''
			SystemImplementation : '''
				«System.out.println("2------SystemTemplate 生成"+subsystem.name+" START------")»
				«system.generate(systemFolder)»
				«System.out.println("2------SystemTemplate 生成"+subsystem.name+" END------")»
				«Tools.sub_addContent(Template.meta_systemfolder,Template.meta_systemheadfile,"#include \""+subsystem.name.convert+".h\"")»
				
				
«««				«FileHelper.addContent(Template.meta_systemfolder,Template.meta_systemheadfile,"#include \""+subsystem.name.convert+".h\"")»
				
			'''
			default:'''
				«println("[freedom-WARNING] SystemTemplate->subsystemCreate :"+system)»
			'''
		}
	}
	
	
	/*
	 * 处理系统实现组件
	 * @param parentFolderPath 此系统目录的父目录路径
	 * @param system 此系统实现实例
	 * 
	 * @litao
	 */	
	
	def static generateSystem(String parentFolderPath, SystemImplementation system)'''
	
		«IF system.name!=null»
			«createPropertyXml(system,parentFolderPath)»
			«««在工程下创建名为 system_name 的文件夹
			«var systemfolder1=parentFolderPath+"/"+system.name.convert»
			«Template.systemfolder=parentFolderPath+"/"+system.name.convert»
«««			«println(CFolder)»
«««			«println(system.name.convert)»
«««			«println(Template.systemfolder)»
			«Tools.folder(systemfolder1)»
			«««设置生成代码系统的文件夹名
				
			«Tools.createFile(systemfolder1,system.name.convert+".h",Template.dhead)»
			«IF Template.dealPackage »
					«IF null!==system.package»
					«Tools.createFile(systemfolder1,"DataType.h",system.getPackage)»
					«ENDIF»
					«Template.dealPackage=false»	
			«ENDIF»
			«««在 system_name 文件夹中生成名为system_name.h的文件，内容来自Template中的dhead
			«IF Template.isMeta»
					«Template.meta_systemfolder=CFolder+"/"+system.name.convert»
					«Template.meta_systemheadfile=system.name.convert+".h"»
					«CFolder=Template.meta_systemfolder»
					«Template.isMeta=false»
			«ELSE»
					«Tools.addContent(systemfolder1,system.name.convert+".h","#include \""+Template.meta_systemheadfile+"\"")»
			«ENDIF»
			«Template.systemheadfile=system.name.convert+".h"»
«««			«genSystemFeature(Template.systemfolder,system.name,system.allFeatures)»
			«Tools.addContent(systemfolder1,Template.systemheadfile,systemFeature(system.allFeatures).toString)»
			/**************************
			* deal with connection start
			**************************/		
			«Tools.addContent(systemfolder1,Template.systemheadfile,system.allConnections.dealWithConnections)»
			/**************************
			* deal with connection end
			**************************/				
			
			«««设置系统（C实现）的头文件（主？）system_name.h
			
			
		/**************************
		* deal with subcomponets start
		**************************/
		«Tools.createFile(systemfolder1,system.name.convert+".c",system.initSystem.toString)»
		«IF system.allSubcomponents!=null»
		«««如果systemImplementation对象拥有Subcomponent
			«FOR Subcomponent subcomponent : system.allSubcomponents»
			«««遍历所有Subcomponent，通过Template生成对应代码
				«subcomponent.template(systemfolder1)»
			«ENDFOR»
		«ENDIF»
		/**************************
		* deal with subcomponets end
		**************************/				
		«ENDIF»
		

		
	'''
	def static initSystem(SystemImplementation sys)'''
			#include "«sys.name.convert».h"
			#include "taskLib.h"
			#define STACK_SIZE 1000
			#define DEFAULT_PRIORITY 200
			«sys.initSystemTask»
	'''
	def static initSystemData(SystemImplementation sys)'''
	
	'''
	def static initSystemTask(SystemImplementation sys)'''
		/*init task*/
		int «sys.name.convert»_init_task()
		{
«««			«IF process.allSubcomponents!=null»
«««			«process.allFeatures.toString»
«««			«ENDIF»
			«FOR Subcomponent sub : sys.allSubcomponents»
			«switch sub{
				ProcessSubcomponent : '''
					if ( taskSpawn("«sub.classifier.name.convert»",DEFAULT_PRIORITY,0,STACK_SIZE, (FUNCPTR)«sub.classifier.name.convert»,1,2,3,4,5,6,7,8,9,10) == ERROR)
					{
						printf("ERR:Memory Not Enough!\n");	
						taskDelay(0);	
					}
				'''
				SystemSubcomponent:'''
					«sub.name.convert»_init_task(); // 初始化
				'''
				default:'''
					//Generate.xtend 138	default =======«sub.category.getName()»===========
				'''
			}»
			«ENDFOR»
			/*任务创建完之后挂起任务*/
			taskDelay(0);	
		}		
	'''
	
	def static getPackage(SystemImplementation sysimpl){
		var publicSection=sysimpl.eContainer as PublicPackageSection;
		if(publicSection!=null)
		for (modelUnit : publicSection.importedUnits) {
			switch modelUnit{
				AadlPackage case modelUnit.name.equals("DataType"):
				return genDataType(modelUnit)
			}
		}
	}
	 
	
}
	
